Skip to content

[Clang] Rework creating offloading toolchains #125556

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 21, 2025
Merged

Conversation

jhuber6
Copy link
Contributor

@jhuber6 jhuber6 commented Feb 3, 2025

Summary:
This patch reworks how we create offloading toolchains. Previously we would handle this separately for all the different kinds. This patch instead changes this to use the target triple and the offloading kind to determine the proper toolchain. In the old case where the user only passes --offload-arch we instead infer the triple from the passed arguments. This is a pretty major overhaul but currently passes all the clang tests with only minor changes to error messages.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Feb 3, 2025
@llvmbot
Copy link
Member

llvmbot commented Feb 3, 2025

@llvm/pr-subscribers-backend-amdgpu
@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-clang

Author: Joseph Huber (jhuber6)

Changes

Summary:
This is a new option that tries to make selecting offloading toolchains
more generic. Currently we infer the toolchain from a combination of the
kind and the --offload-arch= option. Doing this becomes complicated
when we want to start supporting multiple targets for a single
toolchain, i.e. HIP on SPIR-V or AMDGCN. Currently we hack in a special
'architecture' instead, which isn't extensible. Additionally in the
future we may accept compiling CUDA or HIP to some other architecture.


Patch is 31.18 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/125556.diff

11 Files Affected:

  • (modified) clang/include/clang/Basic/DiagnosticDriverKinds.td (+2)
  • (modified) clang/include/clang/Driver/Driver.h (+5-13)
  • (modified) clang/include/clang/Driver/Options.td (+8-3)
  • (modified) clang/lib/Driver/Driver.cpp (+173-108)
  • (modified) clang/lib/Driver/ToolChain.cpp (+32-10)
  • (modified) clang/lib/Driver/ToolChains/Cuda.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Cuda.h (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Darwin.cpp (-24)
  • (modified) clang/test/Driver/Xarch.c (+8)
  • (added) clang/test/Driver/offload-Xarch.c (+31)
  • (added) clang/test/Driver/offload-target.c (+21)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 8d599c96eb4fbf..94baa35e6a9ec7 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -119,6 +119,8 @@ def err_drv_cuda_host_arch : Error<
   "unsupported architecture '%0' for host compilation">;
 def err_drv_mix_cuda_hip : Error<
   "mixed CUDA and HIP compilation is not supported">;
+def err_drv_mix_offload : Error<
+  "mixed %0 and %1 offloading compilation is not supported">;
 def err_drv_bad_target_id : Error<
   "invalid target ID '%0'; format is a processor name followed by an optional "
   "colon-delimited list of features followed by an enable/disable sign (e.g., "
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index f4a52cc529b79c..b463dc2a93550e 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -797,22 +797,14 @@ class Driver {
   const ToolChain &getToolChain(const llvm::opt::ArgList &Args,
                                 const llvm::Triple &Target) const;
 
-  /// @}
-
-  /// Retrieves a ToolChain for a particular device \p Target triple
-  ///
-  /// \param[in] HostTC is the host ToolChain paired with the device
-  ///
-  /// \param[in] TargetDeviceOffloadKind (e.g. OFK_Cuda/OFK_OpenMP/OFK_SYCL) is
-  /// an Offloading action that is optionally passed to a ToolChain (used by
-  /// CUDA, to specify if it's used in conjunction with OpenMP)
+  /// Retrieves a ToolChain for a particular \p Target triple for offloading.
   ///
   /// Will cache ToolChains for the life of the driver object, and create them
   /// on-demand.
-  const ToolChain &getOffloadingDeviceToolChain(
-      const llvm::opt::ArgList &Args, const llvm::Triple &Target,
-      const ToolChain &HostTC,
-      const Action::OffloadKind &TargetDeviceOffloadKind) const;
+  const ToolChain &getOffloadToolChain(const llvm::opt::ArgList &Args,
+                                       const Action::OffloadKind Kind,
+                                       const llvm::Triple &Target,
+                                       const llvm::Triple &AuxTarget) const;
 
   /// Get bitmasks for which option flags to include and exclude based on
   /// the driver mode.
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index d8123cc39fdc95..482d264ef37e2c 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -932,7 +932,9 @@ def W_Joined : Joined<["-"], "W">, Group<W_Group>,
 def Xanalyzer : Separate<["-"], "Xanalyzer">,
   HelpText<"Pass <arg> to the static analyzer">, MetaVarName<"<arg>">,
   Group<StaticAnalyzer_Group>;
-def Xarch__ : JoinedAndSeparate<["-"], "Xarch_">, Flags<[NoXarchOption]>;
+def Xarch__ : JoinedAndSeparate<["-"], "Xarch_">, Flags<[NoXarchOption]>,
+  HelpText<"Pass <arg> to the compiliation if the target matches <arch>">,
+  MetaVarName<"<arch> <arg>">;
 def Xarch_host : Separate<["-"], "Xarch_host">, Flags<[NoXarchOption]>,
   HelpText<"Pass <arg> to the CUDA/HIP host compilation">, MetaVarName<"<arg>">;
 def Xarch_device : Separate<["-"], "Xarch_device">, Flags<[NoXarchOption]>,
@@ -1115,14 +1117,17 @@ def fno_convergent_functions : Flag<["-"], "fno-convergent-functions">,
 
 // Common offloading options
 let Group = offload_Group in {
-def offload_arch_EQ : Joined<["--"], "offload-arch=">, Flags<[NoXarchOption]>,
+def offload_targets_EQ : Joined<["--"], "offload-targets=">,
+  Visibility<[ClangOption, FlangOption]>, Flags<[NoXarchOption]>,
+  HelpText<"Specify a list of target architectures to use for offloading.">;
+
+def offload_arch_EQ : Joined<["--"], "offload-arch=">,
   Visibility<[ClangOption, FlangOption]>,
   HelpText<"Specify an offloading device architecture for CUDA, HIP, or OpenMP. (e.g. sm_35). "
            "If 'native' is used the compiler will detect locally installed architectures. "
            "For HIP offloading, the device architecture can be followed by target ID features "
            "delimited by a colon (e.g. gfx908:xnack+:sramecc-). May be specified more than once.">;
 def no_offload_arch_EQ : Joined<["--"], "no-offload-arch=">,
-  Flags<[NoXarchOption]>,
   Visibility<[ClangOption, FlangOption]>,
   HelpText<"Remove CUDA/HIP offloading device architecture (e.g. sm_35, gfx906) from the list of devices to compile for. "
            "'all' resets the list to its default value.">;
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 912777a9808b4b..cb0f06b7ed4631 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -879,34 +879,100 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
                    }) ||
       C.getInputArgs().hasArg(options::OPT_hip_link) ||
       C.getInputArgs().hasArg(options::OPT_hipstdpar);
+  bool IsOpenMP =
+      C.getInputArgs().hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
+                               options::OPT_fno_openmp, false);
+  bool IsSYCL = C.getInputArgs().hasFlag(options::OPT_fsycl,
+                                         options::OPT_fno_sycl, false);
+
   bool UseLLVMOffload = C.getInputArgs().hasArg(
       options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, false);
+
+  llvm::DenseSet<Action::OffloadKind> Kinds;
+  const std::pair<bool, Action::OffloadKind> ActiveKinds[] = {
+      {IsCuda, Action::OFK_Cuda},
+      {IsHIP, Action::OFK_HIP},
+      {IsOpenMP, Action::OFK_OpenMP},
+      {IsSYCL, Action::OFK_SYCL}};
+  for (const auto &[Active, Kind] : ActiveKinds)
+    if (Active)
+      Kinds.insert(Kind);
+
+  // Build an offloading toolchain for every requested target and kind.
+  for (StringRef Targets :
+       C.getInputArgs().getAllArgValues(options::OPT_offload_targets_EQ)) {
+    // We currently don't support any kind of mixed offloading.
+    if (Kinds.size() > 1) {
+      Diag(clang::diag::err_drv_mix_offload)
+          << Action::GetOffloadKindName(*Kinds.begin())
+          << Action::GetOffloadKindName(*Kinds.end());
+      return;
+    }
+
+    // OpenMP offloading requires a compatible libomp.
+    if (Kinds.contains(Action::OFK_OpenMP)) {
+      OpenMPRuntimeKind RuntimeKind = getOpenMPRuntime(C.getInputArgs());
+      if (RuntimeKind != OMPRT_OMP && RuntimeKind != OMPRT_IOMP5) {
+        Diag(clang::diag::err_drv_expecting_fopenmp_with_fopenmp_targets);
+        return;
+      }
+    }
+
+    // Certain options are not allowed when combined with SYCL compilation.
+    if (Kinds.contains(Action::OFK_SYCL)) {
+      for (auto ID :
+           {options::OPT_static_libstdcxx, options::OPT_ffreestanding})
+        if (Arg *IncompatArg = C.getInputArgs().getLastArg(ID))
+          Diag(clang::diag::err_drv_argument_not_allowed_with)
+              << IncompatArg->getSpelling() << "-fsycl";
+    }
+
+    // Create a device toolchain for every specified triple.
+    for (StringRef Target : llvm::split(Targets, ",")) {
+      llvm::Triple TT(Target);
+      for (Action::OffloadKind Kind : Kinds) {
+        auto &TC = getOffloadToolChain(C.getInputArgs(), Kind, TT,
+                                       C.getDefaultToolChain().getTriple());
+
+        // Emit a warning if the detected CUDA version is too new.
+        if (Kind == Action::OFK_Cuda) {
+          auto &CudaInstallation =
+              static_cast<const toolchains::CudaToolChain &>(TC)
+                  .CudaInstallation;
+          if (CudaInstallation.isValid())
+            CudaInstallation.WarnIfUnsupportedVersion();
+        }
+
+        C.addOffloadDeviceToolChain(&TC, Kind);
+      }
+    }
+  }
+
+  // If the user did not specify the toolchains specifically we will infer them
+  // based on the usage of `--offloard-arch=`.
+  if (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ))
+    return;
+
   if (IsCuda && IsHIP) {
     Diag(clang::diag::err_drv_mix_cuda_hip);
     return;
   }
   if (IsCuda && !UseLLVMOffload) {
-    const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>();
-    const llvm::Triple &HostTriple = HostTC->getTriple();
-    auto OFK = Action::OFK_Cuda;
-    auto CudaTriple =
-        getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), HostTriple);
+    auto CudaTriple = getNVIDIAOffloadTargetTriple(
+        *this, C.getInputArgs(), C.getDefaultToolChain().getTriple());
     if (!CudaTriple)
       return;
-    // Use the CUDA and host triples as the key into the ToolChains map,
-    // because the device toolchain we create depends on both.
-    auto &CudaTC = ToolChains[CudaTriple->str() + "/" + HostTriple.str()];
-    if (!CudaTC) {
-      CudaTC = std::make_unique<toolchains::CudaToolChain>(
-          *this, *CudaTriple, *HostTC, C.getInputArgs());
-
-      // Emit a warning if the detected CUDA version is too new.
-      CudaInstallationDetector &CudaInstallation =
-          static_cast<toolchains::CudaToolChain &>(*CudaTC).CudaInstallation;
-      if (CudaInstallation.isValid())
-        CudaInstallation.WarnIfUnsupportedVersion();
-    }
-    C.addOffloadDeviceToolChain(CudaTC.get(), OFK);
+
+    auto &TC =
+        getOffloadToolChain(C.getInputArgs(), Action::OFK_Cuda, *CudaTriple,
+                            C.getDefaultToolChain().getTriple());
+
+    // Emit a warning if the detected CUDA version is too new.
+    const CudaInstallationDetector &CudaInstallation =
+        static_cast<const toolchains::CudaToolChain &>(TC).CudaInstallation;
+    if (CudaInstallation.isValid())
+      CudaInstallation.WarnIfUnsupportedVersion();
+    C.addOffloadDeviceToolChain(&TC, Action::OFK_Cuda);
   } else if (IsHIP && !UseLLVMOffload) {
     if (auto *OMPTargetArg =
             C.getInputArgs().getLastArg(options::OPT_fopenmp_targets_EQ)) {
@@ -914,14 +980,15 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
           << OMPTargetArg->getSpelling() << "HIP";
       return;
     }
-    const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>();
-    auto OFK = Action::OFK_HIP;
+
     auto HIPTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs());
     if (!HIPTriple)
       return;
-    auto *HIPTC = &getOffloadingDeviceToolChain(C.getInputArgs(), *HIPTriple,
-                                                *HostTC, OFK);
-    C.addOffloadDeviceToolChain(HIPTC, OFK);
+
+    auto &TC =
+        getOffloadToolChain(C.getInputArgs(), Action::OFK_HIP, *HIPTriple,
+                            C.getDefaultToolChain().getTriple());
+    C.addOffloadDeviceToolChain(&TC, Action::OFK_HIP);
   }
 
   if (IsCuda || IsHIP)
@@ -934,10 +1001,8 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
   // the -fopenmp-targets option or used --offload-arch with OpenMP enabled.
   bool IsOpenMPOffloading =
       ((IsCuda || IsHIP) && UseLLVMOffload) ||
-      (C.getInputArgs().hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
-                                options::OPT_fno_openmp, false) &&
-       (C.getInputArgs().hasArg(options::OPT_fopenmp_targets_EQ) ||
-        C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)));
+      (IsOpenMP && (C.getInputArgs().hasArg(options::OPT_fopenmp_targets_EQ) ||
+                    C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)));
   if (IsOpenMPOffloading) {
     // We expect that -fopenmp-targets is always used in conjunction with the
     // option -fopenmp specifying a valid runtime with offloading support, i.e.
@@ -1038,50 +1103,23 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
       FoundNormalizedTriples[NormalizedName] = Val;
 
       // If the specified target is invalid, emit a diagnostic.
-      if (TT.getArch() == llvm::Triple::UnknownArch)
+      if (TT.getArch() == llvm::Triple::UnknownArch) {
         Diag(clang::diag::err_drv_invalid_omp_target) << Val;
-      else {
-        const ToolChain *TC;
-        // Device toolchains have to be selected differently. They pair host
-        // and device in their implementation.
-        if (TT.isNVPTX() || TT.isAMDGCN() || TT.isSPIRV()) {
-          const ToolChain *HostTC =
-              C.getSingleOffloadToolChain<Action::OFK_Host>();
-          assert(HostTC && "Host toolchain should be always defined.");
-          auto &DeviceTC =
-              ToolChains[TT.str() + "/" + HostTC->getTriple().normalize()];
-          if (!DeviceTC) {
-            if (TT.isNVPTX())
-              DeviceTC = std::make_unique<toolchains::CudaToolChain>(
-                  *this, TT, *HostTC, C.getInputArgs());
-            else if (TT.isAMDGCN())
-              DeviceTC = std::make_unique<toolchains::AMDGPUOpenMPToolChain>(
-                  *this, TT, *HostTC, C.getInputArgs());
-            else if (TT.isSPIRV())
-              DeviceTC = std::make_unique<toolchains::SPIRVOpenMPToolChain>(
-                  *this, TT, *HostTC, C.getInputArgs());
-            else
-              assert(DeviceTC && "Device toolchain not defined.");
-          }
-
-          TC = DeviceTC.get();
-        } else
-          TC = &getToolChain(C.getInputArgs(), TT);
-        C.addOffloadDeviceToolChain(TC, Action::OFK_OpenMP);
-        auto It = DerivedArchs.find(TT.getTriple());
-        if (It != DerivedArchs.end())
-          KnownArchs[TC] = It->second;
+        continue;
       }
+
+      auto &TC = getOffloadToolChain(C.getInputArgs(), Action::OFK_OpenMP, TT,
+                                     C.getDefaultToolChain().getTriple());
+      C.addOffloadDeviceToolChain(&TC, Action::OFK_OpenMP);
+      auto It = DerivedArchs.find(TT.getTriple());
+      if (It != DerivedArchs.end())
+        KnownArchs[&TC] = It->second;
     }
   } else if (C.getInputArgs().hasArg(options::OPT_fopenmp_targets_EQ)) {
     Diag(clang::diag::err_drv_expecting_fopenmp_with_fopenmp_targets);
     return;
   }
 
-  // We need to generate a SYCL toolchain if the user specified -fsycl.
-  bool IsSYCL = C.getInputArgs().hasFlag(options::OPT_fsycl,
-                                         options::OPT_fno_sycl, false);
-
   auto argSYCLIncompatible = [&](OptSpecifier OptId) {
     if (!IsSYCL)
       return;
@@ -1103,9 +1141,9 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
     // getOffloadingDeviceToolChain, because the device toolchains we're
     // going to create will depend on both.
     const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>();
-    for (const auto &TargetTriple : UniqueSYCLTriplesVec) {
-      auto SYCLTC = &getOffloadingDeviceToolChain(
-          C.getInputArgs(), TargetTriple, *HostTC, Action::OFK_SYCL);
+    for (const auto &TT : UniqueSYCLTriplesVec) {
+      auto SYCLTC = &getOffloadToolChain(C.getInputArgs(), Action::OFK_SYCL, TT,
+                                         HostTC->getTriple());
       C.addOffloadDeviceToolChain(SYCLTC, Action::OFK_SYCL);
     }
   }
@@ -3409,7 +3447,8 @@ class OffloadingActionBuilder final {
       // Collect all offload arch parameters, removing duplicates.
       std::set<StringRef> GpuArchs;
       bool Error = false;
-      for (Arg *A : Args) {
+      const ToolChain &TC = *ToolChains.front();
+      for (Arg *A : C.getArgsForToolChain(&TC, "", AssociatedOffloadKind)) {
         if (!(A->getOption().matches(options::OPT_offload_arch_EQ) ||
               A->getOption().matches(options::OPT_no_offload_arch_EQ)))
           continue;
@@ -3420,7 +3459,6 @@ class OffloadingActionBuilder final {
               ArchStr == "all") {
             GpuArchs.clear();
           } else if (ArchStr == "native") {
-            const ToolChain &TC = *ToolChains.front();
             auto GPUsOrErr = ToolChains.front()->getSystemGPUArchs(Args);
             if (!GPUsOrErr) {
               TC.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
@@ -6604,6 +6642,72 @@ std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const {
   return std::string(Output);
 }
 
+const ToolChain &Driver::getOffloadToolChain(
+    const llvm::opt::ArgList &Args, const Action::OffloadKind Kind,
+    const llvm::Triple &Target, const llvm::Triple &AuxTarget) const {
+  auto &TC = ToolChains[Target.str() + "/" + AuxTarget.str()];
+  auto &HostTC = ToolChains[AuxTarget.str()];
+
+  assert(HostTC && "Host toolchain for offloading doesn't exit?");
+  if (!TC) {
+    // Detect the toolchain based off of the target operating system.
+    switch (Target.getOS()) {
+    case llvm::Triple::CUDA:
+      TC = std::make_unique<toolchains::CudaToolChain>(*this, Target, *HostTC,
+                                                       Args);
+      break;
+    case llvm::Triple::AMDHSA:
+      if (Kind == Action::OFK_HIP)
+        TC = std::make_unique<toolchains::HIPAMDToolChain>(*this, Target,
+                                                           *HostTC, Args);
+      else if (Kind == Action::OFK_OpenMP)
+        TC = std::make_unique<toolchains::AMDGPUOpenMPToolChain>(*this, Target,
+                                                                 *HostTC, Args);
+      break;
+    default:
+      break;
+    }
+  }
+  if (!TC) {
+    // Detect the toolchain based off of the target architecture if that failed.
+    switch (Target.getArch()) {
+    case llvm::Triple::spir:
+    case llvm::Triple::spir64:
+    case llvm::Triple::spirv:
+    case llvm::Triple::spirv32:
+    case llvm::Triple::spirv64:
+      switch (Kind) {
+      case Action::OFK_SYCL:
+        TC = std::make_unique<toolchains::SYCLToolChain>(*this, Target, *HostTC,
+                                                         Args);
+        break;
+      case Action::OFK_HIP:
+        TC = std::make_unique<toolchains::HIPSPVToolChain>(*this, Target,
+                                                           *HostTC, Args);
+        break;
+      case Action::OFK_OpenMP:
+        TC = std::make_unique<toolchains::SPIRVOpenMPToolChain>(*this, Target,
+                                                                *HostTC, Args);
+        break;
+      case Action::OFK_Cuda:
+        TC = std::make_unique<toolchains::CudaToolChain>(*this, Target, *HostTC,
+                                                         Args);
+        break;
+      default:
+        break;
+      }
+      break;
+    default:
+      break;
+    }
+  }
+
+  // If all else fails, just look up the normal toolchain for the target.
+  if (!TC)
+    return getToolChain(Args, Target);
+  return *TC;
+}
+
 const ToolChain &Driver::getToolChain(const ArgList &Args,
                                       const llvm::Triple &Target) const {
 
@@ -6797,45 +6901,6 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
   return *TC;
 }
 
-const ToolChain &Driver::getOffloadingDeviceToolChain(
-    const ArgList &Args, const llvm::Triple &Target, const ToolChain &HostTC,
-    const Action::OffloadKind &TargetDeviceOffloadKind) const {
-  // Use device / host triples as the key into the ToolChains map because the
-  // device ToolChain we create depends on both.
-  auto &TC = ToolChains[Target.str() + "/" + HostTC.getTriple().str()];
-  if (!TC) {
-    // Categorized by offload kind > arch rather than OS > arch like
-    // the normal getToolChain call, as it seems a reasonable way to categorize
-    // things.
-    switch (TargetDeviceOffloadKind) {
-    case Action::OFK_HIP: {
-      if (((Target.getArch() == llvm::Triple::amdgcn ||
-            Target.getArch() == llvm::Triple::spirv64) &&
-           Target.getVendor() == llvm::Triple::AMD &&
-           Target.getOS() == llvm::Triple::AMDHSA) ||
-          !Args.hasArgNoClaim(options::OPT_offload_EQ))
-        TC = std::make_unique<toolchains::HIPAMDToolChain>(*this, Target,
-                                                           HostTC, Args);
-      else if (Target.getArch() == llvm::Triple::spirv64 &&
-               Target.getVendor() == llvm::Triple::UnknownVendor &&
-               Target.getOS() == llvm::Triple::UnknownOS)
-        TC = std::make_unique<toolchains::HIPSPVToolChain>(*this, Target,
-                                                           HostTC, Args);
-      break;
-    }
-    case Action::OFK_SYCL:
-      if (Target.isSPIROrSPIRV())
-        TC = std::make_unique<toolchains::SYCLToolChain>(*this, Target, HostTC,
-                                                         Args);
-      break;
-    default:
-      break;
-    }
-  }
-  assert(TC && "Could n...
[truncated]

@jhuber6
Copy link
Contributor Author

jhuber6 commented Feb 3, 2025

Contains two dependent commits, last one is the patch. Might need to have some additional error handling to reject known broken architectures, also need to correctly handle things like --offload-targets=spirv64-amd-amdhsa,amdgcn-amd-amdhsa in the new driver.

@jhuber6 jhuber6 changed the title [Clang] Introduce '--offload-targets=' to genericall target toolchains [Clang] Introduce '--offload-targets=' to generically target toolchains Feb 3, 2025
Copy link
Collaborator

@shafik shafik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies, if I am missing it but I don't see a test emitting the diagnostic err_drv_mix_offload anywhere.

@jhuber6
Copy link
Contributor Author

jhuber6 commented Feb 3, 2025

Apologies, if I am missing it but I don't see a test emitting the diagnostic err_drv_mix_offload anywhere.

I'll add a test for it, there's also a few other things I need to tweak.

@asudarsa
Copy link
Contributor

Hi @jhuber6

Just a quick ping to check if this PR is still alive. I can take a look if it is.

Thanks

@jhuber6
Copy link
Contributor Author

jhuber6 commented Apr 1, 2025

Hi @jhuber6

Just a quick ping to check if this PR is still alive. I can take a look if it is.

Thanks

I need to redo it, but I do want it to work.

@jhuber6 jhuber6 changed the title [Clang] Introduce '--offload-targets=' to generically target toolchains [Clang] Rework creating offloading toolchains Jul 16, 2025
@jhuber6 jhuber6 requested review from arsenm and sarnex July 16, 2025 22:50
Copy link

github-actions bot commented Jul 16, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

@jhuber6
Copy link
Contributor Author

jhuber6 commented Jul 16, 2025

I've updated this, it should allow creating multiple offloading toolchains. It's still a little iffy with the old driver, and I'll need a follow-up for SPIR-V on the new driver, but it's a reasonable cleanup.

@jhuber6 jhuber6 force-pushed the offload_target branch 2 times, most recently from 074ca1d to 1f7de90 Compare July 16, 2025 22:55
Copy link
Member

@sarnex sarnex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm minus nits, nice cleanup! it looks like we now have a bit more separation between offloading language and offloading target and we could more easily add new cases which is definitely a plus

i'll have to test this out with OpenMP SPIR-V at some point, but i don't see anything that seems like it would be really bad, and i might have to do something to see if I can hook up runtime detection of Intel GPUs, we should have some tool that can do it

@jhuber6 jhuber6 force-pushed the offload_target branch 2 times, most recently from d8927c3 to 447698d Compare July 17, 2025 01:38
Copy link
Member

@Artem-B Artem-B left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Drive-by style/syntax mostly review. LGTM overall, with a few nits.

@@ -14,14 +14,14 @@
// RUN: | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
// RUN: not %clang -### --target=x86_64-unknown-linux-gnu -nogpulib --offload-new-driver --offload-arch=native --amdgpu-arch-tool=%t/amdgpu_arch_fail -x hip %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
// NO-OUTPUT-ERROR: error: cannot determine amdgcn architecture{{.*}}; consider passing it via '--offload-arch'
// NO-OUTPUT-ERROR: error: cannot determine hip architecture{{.*}}; consider passing it via '--offload-arch'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new message sounds odd, as there's no such thing as HIP or CUDA architecture. I guess it should be something along the lines of "determine target architecture for the HIP compilation".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I can reword them a bit. Mostly it just comes from the fact that now it's a generic 'offload-arch' utility instead of two separate ones we can't as easily make a distinction on which architecture it failed on.

@@ -4,7 +4,7 @@
// RUN: --rocm-path=%S/Inputs/rocm \
// RUN: %s 2>&1 | FileCheck -check-prefix=NOPLUS %s

// NOPLUS: error: invalid target ID 'gfx908xnack'
// NOPLUS: error: unsupported HIP gpu architecture: gfx908xnack
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"HIP compilation can not target GPU architecture..."

Summary:
This is a new option that tries to make selecting offloading toolchains
more generic. Currently we infer the toolchain from a combination of the
kind and the `--offload-arch=` option. Doing this becomes complicated
when we want to start supporting multiple targets for a single
toolchain, i.e. HIP on SPIR-V or AMDGCN. Currently we hack in a special
'architecture' instead, which isn't extensible. Additionally in the
future we may accept compiling CUDA or HIP to some other architecture.
llvm::MemoryBuffer::getFile(OutputFile.c_str());
if (!OutputBuf)
return llvm::createStringError(OutputBuf.getError(),
"Failed to read stdout of " + Executable +
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error messages should start with lowercase

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These were already here, could we move changing them into a follow-up?

return GPUArchs;
} else if ((*StdoutOrErr)->getBuffer().empty()) {
C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
<< Action::GetOffloadKindName(Kind) << "No GPU detected in the system"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error messages should start with lowercase

static std::optional<llvm::Triple> getOffloadTargetTriple(const Driver &D,
const ArgList &Args) {
auto OffloadTargets = Args.getAllArgValues(options::OPT_offload_EQ);
// Offload compilation flow does not support multiple targets for now. We
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can multiple targets be supported for SYCL offload as well in this scenario? (Not too familiar with ActionBuilders).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this unifies the OpenMP way of doing it. If you had some incredibly complex scenario it would look like this for OpenMP.

clang -fopenmp input.c --offload-targets=amdgcn-amd-amdhsa,nvptx64-nvidia-cuda,x86_64-unknown-linux-gnu -Xarch_amdgcn --offload-arch=gfx1030,gfx90a -Xarch_nvptx64 --offload-arch=sm_89 -Xarch_x86_64 --offload-arch=skylake

SYCL would work the same way, it would just create different toolchains due to the SYCL offloading kind.

@jhuber6 jhuber6 merged commit a7d9365 into llvm:main Jul 21, 2025
9 checks passed
@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 21, 2025

LLVM Buildbot has detected a new failure on builder sanitizer-x86_64-linux-android running on sanitizer-buildbot-android while building clang at step 2 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/186/builds/10917

Here is the relevant piece of the build log for the reference
Step 2 (annotate) failure: 'python ../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py' (failure)
...
[4515/5579] Linking CXX static library lib/libclangParse.a
[4516/5579] Linking CXX static library lib/libclangRewrite.a
[4517/5579] Linking CXX executable bin/llvm-ar
[4518/5579] Generating ../../bin/llvm-ranlib
[4519/5579] Generating ../../bin/llvm-lib
[4520/5579] Generating ../../bin/llvm-dlltool
[4521/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[4522/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/CSKY.cpp.o
[4523/5579] Linking CXX executable bin/llvm-lto
[4524/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/lib/Driver -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[4525/5579] Linking CXX shared library lib/libLTO.so.22.0git
[4526/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[4527/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/M68k.cpp.o
[4528/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
[4529/5579] Linking CXX executable bin/lld
[4530/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/LoongArch.cpp.o
[4531/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
[4532/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChain.cpp.o
[4533/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
[4534/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/Mips.cpp.o
[4535/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/PPC.cpp.o
[4536/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/RISCV.cpp.o
[4537/5579] Building CXX object tools/clang/lib/CodeGen/CMakeFiles/obj.clangCodeGen.dir/CodeGenAction.cpp.o
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild


@@@STEP_FAILURE@@@

@@@STEP_FAILURE@@@

Step 8 (bootstrap clang) failure: bootstrap clang (failure)
...
[4515/5579] Linking CXX static library lib/libclangParse.a
[4516/5579] Linking CXX static library lib/libclangRewrite.a
[4517/5579] Linking CXX executable bin/llvm-ar
[4518/5579] Generating ../../bin/llvm-ranlib
[4519/5579] Generating ../../bin/llvm-lib
[4520/5579] Generating ../../bin/llvm-dlltool
[4521/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[4522/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/CSKY.cpp.o
[4523/5579] Linking CXX executable bin/llvm-lto
[4524/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/lib/Driver -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/include -I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[4525/5579] Linking CXX shared library lib/libLTO.so.22.0git
[4526/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[4527/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/M68k.cpp.o
[4528/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
[4529/5579] Linking CXX executable bin/lld
[4530/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/LoongArch.cpp.o
[4531/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
[4532/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChain.cpp.o
[4533/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
[4534/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/Mips.cpp.o
[4535/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/PPC.cpp.o
[4536/5579] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/RISCV.cpp.o
[4537/5579] Building CXX object tools/clang/lib/CodeGen/CMakeFiles/obj.clangCodeGen.dir/CodeGenAction.cpp.o
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




program finished with exit code 2
elapsedTime=182.977195

@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 21, 2025

LLVM Buildbot has detected a new failure on builder sanitizer-ppc64le-linux running on ppc64le-sanitizer while building clang at step 2 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/72/builds/13357

Here is the relevant piece of the build log for the reference
Step 2 (annotate) failure: 'python ../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py' (failure)
...
[3872/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/CSKYToolChain.cpp.o
[3873/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AVR.cpp.o
[3874/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HIPAMD.cpp.o
[3875/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[3876/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[3877/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Fuchsia.cpp.o
[3878/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/NetBSD.cpp.o
[3879/4277] Building CXX object tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/CreateInvocationFromCommandLine.cpp.o
[3880/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
[3881/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[3882/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o
[3883/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
[3884/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Cuda.cpp.o
[3885/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MSVC.cpp.o
[3886/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
[3887/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/BareMetal.cpp.o
[3888/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HIPUtility.cpp.o
[3889/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MinGW.cpp.o
[3890/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/OHOS.cpp.o
[3891/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MSP430.cpp.o
[3892/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AIX.cpp.o
[3893/4277] Building CXX object lib/MC/MCParser/CMakeFiles/LLVMMCParser.dir/AsmParser.cpp.o
[3894/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AMDGPU.cpp.o
[3895/4277] Building CXX object tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o
[3896/4277] Building CXX object tools/clang/lib/Tooling/CMakeFiles/obj.clangTooling.dir/CompilationDatabase.cpp.o
[3897/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Linux.cpp.o
[3898/4277] Building CXX object tools/clang/lib/Tooling/CMakeFiles/obj.clangTooling.dir/Tooling.cpp.o
[3899/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HLSL.cpp.o
[3900/4277] Building CXX object tools/clang/lib/StaticAnalyzer/Frontend/CMakeFiles/obj.clangStaticAnalyzerFrontend.dir/CheckerRegistry.cpp.o
[3901/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Darwin.cpp.o
[3902/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/CommonArgs.cpp.o
[3903/4277] Building CXX object tools/clang/lib/Interpreter/CMakeFiles/obj.clangInterpreter.dir/InterpreterUtils.cpp.o
Step 8 (build compiler-rt debug) failure: build compiler-rt debug (failure)
...
[3872/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/CSKYToolChain.cpp.o
[3873/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AVR.cpp.o
[3874/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HIPAMD.cpp.o
[3875/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[3876/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[3877/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Fuchsia.cpp.o
[3878/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/NetBSD.cpp.o
[3879/4277] Building CXX object tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/CreateInvocationFromCommandLine.cpp.o
[3880/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
[3881/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[3882/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o
[3883/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
[3884/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Cuda.cpp.o
[3885/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MSVC.cpp.o
[3886/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
[3887/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/BareMetal.cpp.o
[3888/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HIPUtility.cpp.o
[3889/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MinGW.cpp.o
[3890/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/OHOS.cpp.o
[3891/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/MSP430.cpp.o
[3892/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AIX.cpp.o
[3893/4277] Building CXX object lib/MC/MCParser/CMakeFiles/LLVMMCParser.dir/AsmParser.cpp.o
[3894/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AMDGPU.cpp.o
[3895/4277] Building CXX object tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o
[3896/4277] Building CXX object tools/clang/lib/Tooling/CMakeFiles/obj.clangTooling.dir/CompilationDatabase.cpp.o
[3897/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Linux.cpp.o
[3898/4277] Building CXX object tools/clang/lib/Tooling/CMakeFiles/obj.clangTooling.dir/Tooling.cpp.o
[3899/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HLSL.cpp.o
[3900/4277] Building CXX object tools/clang/lib/StaticAnalyzer/Frontend/CMakeFiles/obj.clangStaticAnalyzerFrontend.dir/CheckerRegistry.cpp.o
[3901/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Darwin.cpp.o
[3902/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/CommonArgs.cpp.o
[3903/4277] Building CXX object tools/clang/lib/Interpreter/CMakeFiles/obj.clangInterpreter.dir/InterpreterUtils.cpp.o
Step 9 (test compiler-rt debug) failure: test compiler-rt debug (failure)
...
[207/245] Linking CXX static library lib/libclangSema.a
[208/245] Linking CXX static library lib/libclangParse.a
[209/245] Linking CXX static library lib/libclangSerialization.a
[210/245] Linking CXX executable bin/clang-offload-packager
[211/245] Linking CXX executable bin/llvm-jitlink
[212/245] Linking CXX executable bin/lli
[213/245] Linking CXX executable bin/llvm-lto
[214/245] Linking CXX executable bin/opt
[215/245] Linking CXX executable bin/lld
[216/245] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




Step 10 (build compiler-rt tsan_debug) failure: build compiler-rt tsan_debug (failure)
...
[3910/4255] Linking CXX static library lib/libLLVMDebugInfoGSYM.a
[3911/4255] Linking CXX static library lib/libLLVMDebugInfoLogicalView.a
[3912/4255] Linking CXX static library lib/libLLVMDWP.a
[3913/4255] Linking CXX static library lib/libLLVMTextAPIBinaryReader.a
[3914/4255] Linking CXX executable bin/llvm-mca
[3915/4255] Linking CXX executable bin/llvm-strings
[3916/4255] Linking CXX executable bin/llvm-ml
[3917/4255] Generating ../../bin/llvm-ml64
[3918/4255] Linking CXX executable bin/llvm-mc
[3919/4255] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[3920/4255] Linking CXX static library lib/libLLVMSymbolize.a
[3921/4255] Linking CXX executable bin/llvm-rc
[3922/4255] Linking CXX executable bin/llvm-cvtres
[3923/4255] Linking CXX executable bin/llvm-cxxdump
[3924/4255] Linking CXX executable bin/llvm-size
[3925/4255] Linking CXX executable bin/llvm-ifs
[3926/4255] Linking CXX executable bin/llvm-ar
[3927/4255] Linking CXX executable bin/llvm-dwarfdump
[3928/4255] Linking CXX executable bin/llvm-objcopy
[3929/4255] Linking CXX executable bin/llvm-pdbutil
[3930/4255] Linking CXX executable bin/llvm-readobj
[3931/4255] Linking CXX executable bin/llvm-debuginfo-analyzer
[3932/4255] Linking CXX executable bin/llvm-readtapi
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




Step 11 (build compiler-rt default) failure: build compiler-rt default (failure)
...
[3933/4277] Linking CXX static library lib/libLLVMDWP.a
[3934/4277] Linking CXX static library lib/libLLVMDebugInfoGSYM.a
[3935/4277] Linking CXX executable bin/llvm-mca
[3936/4277] Linking CXX static library lib/libLLVMDebugInfoLogicalView.a
[3937/4277] Linking CXX executable bin/llvm-mc
[3938/4277] Linking CXX executable bin/llvm-ml
[3939/4277] Generating ../../bin/llvm-ml64
[3940/4277] Linking CXX static library lib/libLLVMSymbolize.a
[3941/4277] Linking CXX executable bin/llvm-strings
[3942/4277] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
[3943/4277] Linking CXX executable bin/llvm-rc
[3944/4277] Linking CXX executable bin/llvm-cvtres
[3945/4277] Linking CXX static library lib/libLLVMDebuginfod.a
[3946/4277] Linking CXX executable bin/llvm-size
[3947/4277] Linking CXX static library lib/libLLVMCFIVerify.a
[3948/4277] Linking CXX static library lib/libLLVMProfileData.a
[3949/4277] Linking CXX executable bin/llvm-ifs
[3950/4277] Linking CXX executable bin/llvm-debuginfo-analyzer
[3951/4277] Linking CXX executable bin/llvm-cxxdump
[3952/4277] Linking CXX executable bin/llvm-pdbutil
[3953/4277] Linking CXX executable bin/llvm-readtapi
[3954/4277] Linking CXX executable bin/llvm-readobj
[3955/4277] Linking CXX executable bin/llvm-dwarfdump
[3956/4277] Linking CXX executable bin/llvm-objcopy
[3957/4277] Linking CXX executable bin/llvm-ar
[3958/4277] Linking CXX executable bin/sancov
[3959/4277] Linking CXX executable bin/sanstats
[3960/4277] Linking CXX executable bin/llvm-xray
[3961/4277] Linking CXX executable bin/llvm-nm
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild
Step 12 (test compiler-rt default) failure: test compiler-rt default (failure)
...
[182/220] Linking CXX static library lib/libclangSema.a
[183/220] Linking CXX executable bin/clang-offload-packager
[184/220] Linking CXX static library lib/libclangParse.a
[185/220] Linking CXX static library lib/libclangSerialization.a
[186/220] Linking CXX executable bin/llvm-jitlink
[187/220] Linking CXX executable bin/lli
[188/220] Linking CXX executable bin/opt
[189/220] Linking CXX executable bin/llvm-lto
[190/220] Linking CXX executable bin/lld
[191/220] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros /usr/bin/ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
ninja: build stopped: subcommand failed.

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




Step 13 (build standalone compiler-rt) failure: build standalone compiler-rt (failure)
...
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
-- The ASM compiler identification is unknown
-- Didn't find assembler
CMake Error at CMakeLists.txt:22 (project):
  The CMAKE_C_COMPILER:

    /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/bin/clang

  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.


CMake Error at CMakeLists.txt:22 (project):
  The CMAKE_CXX_COMPILER:

    /home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/bin/clang++

  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.


CMake Error at CMakeLists.txt:22 (project):
  No CMAKE_ASM_COMPILER could be found.

  Tell CMake where to find the compiler by setting either the environment
  variable "ASM" or the CMake cache entry CMAKE_ASM_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.
-- Warning: Did not find file Compiler/-ASM
-- Configuring incomplete, errors occurred!

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




ninja: Entering directory `compiler_rt_build'
ninja: error: loading 'build.ninja': No such file or directory

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild




Step 14 (test standalone compiler-rt) failure: test standalone compiler-rt (failure)
@@@BUILD_STEP test standalone compiler-rt@@@
ninja: Entering directory `compiler_rt_build'

How to reproduce locally: https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild


ninja: error: loading 'build.ninja': No such file or directory



@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 21, 2025

LLVM Buildbot has detected a new failure on builder clang-ppc64-aix running on aix-ppc64 while building clang at step 5 "build-unified-tree".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/64/builds/4943

Here is the relevant piece of the build log for the reference
Step 5 (build-unified-tree) failure: build (failure)
...
11.272 [144/10/71] Building OpenCLBuiltins.inc...
14.766 [141/10/72] Building CXX object tools/llvm-config/CMakeFiles/llvm-config.dir/llvm-config.cpp.o
15.109 [140/10/73] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Warnings.cpp.o
16.669 [139/10/74] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Compilation.cpp.o
16.998 [138/10/75] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/MultilibBuilder.cpp.o
17.418 [137/10/76] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Job.cpp.o
17.608 [136/10/77] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/OptionUtils.cpp.o
17.709 [135/10/78] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
19.411 [134/10/79] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/DiagnosticIDs.cpp.o
20.141 [133/10/80] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
/home/llvm/llvm-external-buildbots/clang.19.1.2/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_LARGE_FILE_API -D_XOPEN_SOURCE=700 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/tools/clang/lib/Driver -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/include -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/tools/clang/include -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/include -I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/llvm/include -mcmodel=large -fPIC -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -pthread -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp
/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
20.599 [133/9/81] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
21.151 [133/8/82] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Diagnostic.cpp.o
22.753 [133/7/83] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/CSKY.cpp.o
23.342 [133/6/84] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
23.730 [133/5/85] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
23.755 [133/4/86] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/LoongArch.cpp.o
24.163 [133/3/87] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/M68k.cpp.o
24.474 [133/2/88] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
27.785 [133/1/89] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChain.cpp.o
ninja: build stopped: subcommand failed.

jhuber6 added a commit that referenced this pull request Jul 21, 2025
@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 22, 2025

LLVM Buildbot has detected a new failure on builder ppc64le-lld-multistage-test running on ppc64le-lld-multistage-test while building clang at step 12 "build-stage2-unified-tree".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/168/builds/14433

Here is the relevant piece of the build log for the reference
Step 12 (build-stage2-unified-tree) failure: build (failure)
...
214.946 [1598/1154/3881] Building CXX object lib/Target/WebAssembly/MCTargetDesc/CMakeFiles/LLVMWebAssemblyDesc.dir/WebAssemblyInstPrinter.cpp.o
214.960 [1597/1154/3882] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Sanitizers.cpp.o
214.971 [1596/1154/3883] Building CXX object lib/Target/VE/MCTargetDesc/CMakeFiles/LLVMVEDesc.dir/VEAsmBackend.cpp.o
215.006 [1595/1154/3884] Building CXX object tools/clang/lib/Tooling/Refactoring/CMakeFiles/obj.clangToolingRefactoring.dir/Lookup.cpp.o
215.044 [1594/1154/3885] Building CXX object lib/Target/BPF/CMakeFiles/LLVMBPFCodeGen.dir/BPFCheckAndAdjustIR.cpp.o
215.073 [1593/1154/3886] Building CXX object lib/Target/MSP430/CMakeFiles/LLVMMSP430CodeGen.dir/MSP430InstrInfo.cpp.o
215.104 [1592/1154/3887] Building CXX object lib/Target/Hexagon/CMakeFiles/LLVMHexagonCodeGen.dir/HexagonOptimizeSZextends.cpp.o
215.133 [1591/1154/3888] Building CXX object lib/Target/WebAssembly/CMakeFiles/LLVMWebAssemblyCodeGen.dir/WebAssemblySortRegion.cpp.o
215.163 [1590/1154/3889] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Targets/AVR.cpp.o
215.195 [1589/1154/3890] Building CXX object tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
ccache /home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/install/stage1/bin/clang++ -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/build/stage2/tools/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/clang/lib/Driver -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/build/stage2/tools/clang/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/build/stage2/include -I/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables -fno-rtti -UNDEBUG -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c /home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |        (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
      |                                                                  ~~
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 1091 |             !(IsCuda || IsHIP)));
      |             ~~~~~~~~~~~~~~~~~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-lld-multistage-test/ppc64le-lld-multistage-test/llvm-project/clang/lib/Driver/Driver.cpp:1090:65: note: place parentheses around the '&&' expression to silence this warning
 1090 |         (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
      |                                                                 ^
      |         (
 1091 |             !(IsCuda || IsHIP)));
      |                               
      |                               )
1 error generated.
215.196 [1589/1153/3891] Building CXX object tools/clang/lib/Format/CMakeFiles/obj.clangFormat.dir/TokenAnnotator.cpp.o
215.198 [1589/1152/3892] Building CXX object lib/Target/BPF/CMakeFiles/LLVMBPFCodeGen.dir/BPFInstrInfo.cpp.o
215.199 [1589/1151/3893] Linking CXX static library lib/libLLVMWebAssemblyDesc.a
215.255 [1589/1150/3894] Building CXX object tools/llvm-ifs/CMakeFiles/llvm-ifs.dir/llvm-ifs.cpp.o
215.275 [1589/1149/3895] Building CXX object tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/VerifyDiagnosticConsumer.cpp.o
215.355 [1589/1148/3896] Building CXX object lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/GetDylibInterface.cpp.o
215.375 [1589/1147/3897] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Targets/NVPTX.cpp.o
215.405 [1589/1146/3898] Building CXX object lib/Target/Sparc/MCTargetDesc/CMakeFiles/LLVMSparcDesc.dir/SparcMCTargetDesc.cpp.o
215.465 [1589/1145/3899] Building CXX object lib/Target/Hexagon/CMakeFiles/LLVMHexagonCodeGen.dir/HexagonHazardRecognizer.cpp.o
215.555 [1589/1144/3900] Building CXX object lib/Target/PowerPC/MCTargetDesc/CMakeFiles/LLVMPowerPCDesc.dir/PPCELFStreamer.cpp.o
215.635 [1589/1143/3901] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Targets/XCore.cpp.o
215.665 [1589/1142/3902] Building CXX object lib/Target/Hexagon/CMakeFiles/LLVMHexagonCodeGen.dir/HexagonTargetObjectFile.cpp.o
215.685 [1589/1141/3903] Building CXX object lib/Target/BPF/CMakeFiles/LLVMBPFCodeGen.dir/BPFPreserveStaticOffset.cpp.o
215.686 [1589/1140/3904] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Targets/VE.cpp.o
215.775 [1589/1139/3905] Building CXX object lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/EHFrameRegistrationPlugin.cpp.o
215.841 [1589/1138/3906] Building CXX object lib/Target/ARM/MCTargetDesc/CMakeFiles/LLVMARMDesc.dir/ARMInstPrinter.cpp.o
215.848 [1589/1137/3907] Building CXX object tools/llvm-readobj/CMakeFiles/llvm-readobj.dir/XCOFFDumper.cpp.o
215.852 [1589/1136/3908] Building CXX object lib/Target/Hexagon/CMakeFiles/LLVMHexagonCodeGen.dir/HexagonRegisterInfo.cpp.o
216.007 [1589/1135/3909] Building CXX object lib/Target/WebAssembly/CMakeFiles/LLVMWebAssemblyCodeGen.dir/WebAssemblyRefTypeMem2Local.cpp.o
216.014 [1589/1134/3910] Building CXX object lib/Target/VE/MCTargetDesc/CMakeFiles/LLVMVEDesc.dir/VEMCAsmInfo.cpp.o
216.145 [1589/1133/3911] Building CXX object tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Targets/SPIR.cpp.o
216.175 [1589/1132/3912] Building CXX object lib/Target/Hexagon/MCTargetDesc/CMakeFiles/LLVMHexagonDesc.dir/HexagonShuffler.cpp.o

searlmc1 pushed a commit to ROCm/llvm-project that referenced this pull request Jul 22, 2025
Summary:
This patch reworks how we create offloading toolchains. Previously we would
handle this separately for all the different kinds. This patch instead
changes this to use the target triple and the offloading kind to determine
the proper toolchain. In the old case where the user only passes
 --offload-arch we instead infer the triple from the passed arguments.
This is a pretty major overhaul but currently passes all the clang tests with
only minor changes to error messages.

Note: upstream patch authored by jhuber6. amd-staging cherry-pick for PSDB
and SPIRV testing

llvm#125556
@Meinersbur
Copy link
Member

Meinersbur commented Jul 22, 2025

Failures of the sanitizer builds look related to this

https://lab.llvm.org/buildbot/#/builders/169/builds/13161:

0.	Program arguments: /home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang -emit-llvm --cuda-device-only --offload=spirv32 -nocudalib -nocudainc /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu -o /home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/tools/clang/test/CodeGenCUDASPIRV/Output/copy-aggregate-byval.cu.tmp.bc -c
1.	Compilation construction
 #0 0x00005fb87a758eb6 ___interceptor_backtrace /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:4497:13
 #1 0x00005fb881dad278 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Unix/Signals.inc:834:13
 #2 0x00005fb881da6ed9 llvm::sys::RunSignalHandlers() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Signals.cpp:0:5
 #3 0x00005fb881daf17e SignalHandler(int, siginfo_t*, void*) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Unix/Signals.inc:426:38
 #4 0x00007c6b77045250 (/lib/x86_64-linux-gnu/libc.so.6+0x45250)
 #5 0x00007c6b770a3f1c pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0xa3f1c)
 #6 0x00007c6b7704519e raise (/lib/x86_64-linux-gnu/libc.so.6+0x4519e)
 #7 0x00007c6b77028902 abort (/lib/x86_64-linux-gnu/libc.so.6+0x28902)
 #8 0x00005fb87a7db86c (/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x122b186c)
 #9 0x00005fb87a7d969e __sanitizer::Die() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_termination.cpp:52:5
#10 0x00005fb87a7f4319 (/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x122ca319)
#11 0x00005fb883ae1136 getBuckets /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:901:40
#12 0x00005fb883ae1136 getBuckets /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:575:65
#13 0x00005fb883ae1136 llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::initEmpty() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:442:23
#14 0x00005fb883aede68 grow /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:0:64
#15 0x00005fb883aede68 llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>* llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::InsertIntoBucketImpl<clang::driver::Action::OffloadKind>(clang::driver::Action::OffloadKind const&, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>*) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:0:0
#16 0x00005fb883aed959 InsertIntoBucket<const clang::driver::Action::OffloadKind &, llvm::detail::DenseSetEmpty &> /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:596:29
#17 0x00005fb883aed959 std::__1::pair<llvm::DenseMapIterator<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>, false>, bool> llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::try_emplace<llvm::detail::DenseSetEmpty&>(clang::driver::Action::OffloadKind const&, llvm::detail::DenseSetEmpty&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:292:17
#18 0x00005fb883a800aa pair<llvm::DenseMapIterator<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>, false>, bool, 0> /home/b/sanitizer-x86_64-linux-fast/build/libcxx_install_asan_ubsan/include/c++/v1/__utility/pair.h:196:53
#19 0x00005fb883a800aa insert /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseSet.h:221:12
#20 0x00005fb883a800aa clang::driver::Driver::CreateOffloadingDeviceToolChains(clang::driver::Compilation&, llvm::SmallVector<std::__1::pair<clang::driver::types::ID, llvm::opt::Arg const*>, 16u>&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:1073:13
#21 0x00005fb883a960b2 clang::driver::Driver::BuildCompilation(llvm::ArrayRef<char const*>) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:0:3
#22 0x00005fb87a7fa4f9 clang_main(int, char**, llvm::ToolContext const&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/tools/driver/driver.cpp:376:44
#23 0x00005fb87a826ac6 main /home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/tools/clang/tools/driver/clang-driver.cpp:17:10
#24 0x00007c6b7702a3b8 (/lib/x86_64-linux-gnu/libc.so.6+0x2a3b8)
#25 0x00007c6b7702a47b __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a47b)
#26 0x00005fb87a710325 _start (/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x121e6325)

https://lab.llvm.org/buildbot/#/builders/169/builds/13161:

==> /home/b/sanitizer-x86_64-linux-fast/build/sanitizer_logs/report.AllClangUnitTests.3460876 <==
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:443:35: runtime error: load of value 4294967295, which is not a valid value for type 'const clang::driver::Action::OffloadKind'
    #0 0x63a3ee1a69d5 in llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::initEmpty() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:443:35
    #1 0x63a3ee1b1ee7 in grow /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:587:64
    #2 0x63a3ee1b1ee7 in llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>* llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::InsertIntoBucketImpl<clang::driver::Action::OffloadKind>(clang::driver::Action::OffloadKind const&, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>*) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h
    #3 0x63a3ee1b19d8 in InsertIntoBucket<const clang::driver::Action::OffloadKind &, llvm::detail::DenseSetEmpty &> /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:594:17
    #4 0x63a3ee1b19d8 in std::__1::pair<llvm::DenseMapIterator<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>, false>, bool> llvm::DenseMapBase<llvm::DenseMap<clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>, clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::driver::Action::OffloadKind, void>, llvm::detail::DenseSetPair<clang::driver::Action::OffloadKind>>::try_emplace<llvm::detail::DenseSetEmpty&>(clang::driver::Action::OffloadKind const&, llvm::detail::DenseSetEmpty&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:292:17
    #5 0x63a3ee14f259 in insert /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseSet.h:221:19
    #6 0x63a3ee14f259 in clang::driver::Driver::CreateOffloadingDeviceToolChains(clang::driver::Compilation&, llvm::SmallVector<std::__1::pair<clang::driver::types::ID, llvm::opt::Arg const*>, 16u>&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:1073:13
    #7 0x63a3ee165121 in clang::driver::Driver::BuildCompilation(llvm::ArrayRef<char const*>) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:1826:3
    #8 0x63a3ef0fc8d4 in clang::tooling::ToolInvocation::run() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Tooling/Tooling.cpp:414:15
    #9 0x63a3ef0fb75a in clang::tooling::runToolOnCodeWithArgs(std::__1::unique_ptr<clang::FrontendAction, std::__1::default_delete<clang::FrontendAction>>, llvm::Twine const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&, llvm::Twine const&, llvm::Twine const&, std::__1::shared_ptr<clang::PCHContainerOperations>) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Tooling/Tooling.cpp:221:21
    #10 0x63a3ef0fabc0 in clang::tooling::runToolOnCodeWithArgs(std::__1::unique_ptr<clang::FrontendAction, std::__1::default_delete<clang::FrontendAction>>, llvm::Twine const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&, llvm::Twine const&, llvm::Twine const&, std::__1::shared_ptr<clang::PCHContainerOperations>, std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>> const&) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Tooling/Tooling.cpp:247:10
    #11 0x63a3e2fae1a5 in testing::AssertionResult clang::ast_matchers::matchesConditionallyWithCuda<clang::ast_matchers::internal::BindableMatcher<clang::Stmt>>(llvm::Twine const&, clang::ast_matchers::internal::BindableMatcher<clang::Stmt> const&, bool, llvm::StringRef) /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/unittests/ASTMatchers/ASTMatchersTest.h:237:8
    #12 0x63a3e2e4193b in matchesWithCuda<clang::ast_matchers::internal::BindableMatcher<clang::Stmt> > /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/unittests/ASTMatchers/ASTMatchersTest.h:257:10
    #13 0x63a3e2e4193b in clang::ast_matchers::ASTMatchersTestCUDA_CUDAKernelCallExpr_Test::TestBody() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp:179:3
    #14 0x63a3ea8e7ddc in testing::Test::Run() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2688:5
    #15 0x63a3ea8ea7e4 in testing::TestInfo::Run() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2837:11
    #16 0x63a3ea8ec88f in testing::TestSuite::Run() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:3016:30
    #17 0x63a3ea90cc76 in testing::internal::UnitTestImpl::RunAllTests() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5921:44
    #18 0x63a3ea90be70 in testing::UnitTest::Run() /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5485:10
    #19 0x63a3ea8c000e in RUN_ALL_TESTS /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
    #20 0x63a3ea8c000e in main /home/b/sanitizer-x86_64-linux-fast/build/llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
    #21 0x7bbfdcc2a3b7  (/lib/x86_64-linux-gnu/libc.so.6+0x2a3b7) (BuildId: 91f01b4ad171c80b6303d08d1f08cba8b990413d)
    #22 0x7bbfdcc2a47a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a47a) (BuildId: 91f01b4ad171c80b6303d08d1f08cba8b990413d)
    #23 0x63a3e2286b24 in _start (/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/tools/clang/unittests/AllClangUnitTests+0xf9bab24)

@jhuber6
Copy link
Contributor Author

jhuber6 commented Jul 22, 2025

Yeah, seems like it's getting corrupt data in a dense map of offloading kinds? Guess I'll need to do a sanitizer build.

@shiltian
Copy link
Contributor

Someone else messed up it. The commit has been reverted.

@jhuber6
Copy link
Contributor Author

jhuber6 commented Jul 22, 2025

Someone else messed up it. The commit has been reverted.

Can you link which one? That's some awfully convenient timing that it caused failures on the offloading path at the same time I landed this.

@shiltian
Copy link
Contributor

I don't know which one. My PRs yesterday afternoon have a lot of crash in ADT but after rebase a couple of hours later they were gone. I suppose that would be the one.

@jhuber6
Copy link
Contributor Author

jhuber6 commented Jul 22, 2025

Should be fixed by dc87a14. The sentinel value used in this constant map was triggering UBSan.

// incompatible toolchains from the global option.
Option Opt = C.getDriver().getOpts().getOption(options::OPT_Xarch__);
unsigned Index = C.getArgs().getBaseArgs().MakeIndex("-Xarch_");
Arg *A = new Arg(Opt, C.getArgs().getArgString(Index), Index,
Copy link
Member

@jsji jsji Jul 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ASAN build detected memory leaks in ~75 Driver tests.

bin/clang -### --target=x86_64-linux-gnu --cuda-gpu-arch=gfx900 --rocm-path=clang/test/Driver/Inputs/rocm --cuda-device-only clang/test/Driver/hip-wavefront-size.hip

=================================================================
==845==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 88 byte(s) in 1 object(s) allocated from:
#0 0x7f7b99cdb698 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:95
#1 0x7f7b894eee20 in inferOffloadToolchains(clang::driver::Compilation&, clang::driver::Action::OffloadKind)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any guess why? We call MakeArgString here which creates permanent string storage. The argument string and index should be managed by the argument list as well. The new argument we get out is appended, we do similar things elsewhere. Do you know what could be problematic here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me know if #150142 fixes it.

Copy link
Member

@jsji jsji Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, #150142 fixed them. Thanks!

searlmc1 pushed a commit to ROCm/llvm-project that referenced this pull request Jul 22, 2025
Summary:
This patch reworks how we create offloading toolchains. Previously we would
handle this separately for all the different kinds. This patch instead
changes this to use the target triple and the offloading kind to determine
the proper toolchain. In the old case where the user only passes
 --offload-arch we instead infer the triple from the passed arguments.
This is a pretty major overhaul but currently passes all the clang tests with
only minor changes to error messages.

Note: upstream patch authored by jhuber6. amd-staging cherry-pick for PSDB
and SPIRV testing

llvm#125556
@mstorsjo
Copy link
Member

This broke compilation with Xcode Clang 12 (roughly corresponding to upstream Clang 10):

/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.
cpp:953:14: error: no viable conversion from returned value of type 'SmallVe
ctor<[...], 1>' to function return type 'SmallVector<[...], (default) Calcul
ateSmallVectorDefaultInlinedElements<T>::value aka 2>'
      return GPUArchs;
             ^~~~~~~~
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/Sm
allVector.h:1227:3: note: candidate constructor not viable: no known convers
ion from 'SmallVector<std::string, 1>' (aka 'SmallVector<basic_string<char>,
 1>') to 'std::initializer_list<basic_string<char>>' for 1st argument
  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/Sm
allVector.h:1237:3: note: candidate constructor not viable: no known convers
ion from 'SmallVector<std::string, 1>' (aka 'SmallVector<basic_string<char>,
 1>') to 'const llvm::SmallVector<std::__1::basic_string<char>, 2> &' for 1s
t argument
  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1247:3: note: candidate constructor not viable: no known conversion from 'SmallVector<std::string, 1>' (aka 'SmallVector<basic_string<char>, 1>') to 'llvm::SmallVector<std::__1::basic_string<char>, 2> &&' for 1st argument
  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1252:3: note: candidate constructor not viable: no known conversion from 'SmallVector<std::string, 1>' (aka 'SmallVector<basic_string<char>, 1>') to 'SmallVectorImpl<std::__1::basic_string<char>> &&' for 1st argument
  SmallVector(SmallVectorImpl<T> &&RHS) : SmallVectorImpl<T>(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1206:12: note: explicit constructor is not a candidate
  explicit SmallVector(size_t Size)
           ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1222:12: note: explicit constructor is not a candidate
  explicit SmallVector(const iterator_range<RangeTy> &R)
           ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1233:12: note: explicit constructor is not a candidate
  explicit SmallVector(ArrayRef<U> A) : SmallVectorImpl<T>(N) {
           ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.cpp:958:14: warning: local variable 'GPUArchs' will be copied despite being returned by name [-Wreturn-std-move]
      return GPUArchs;
             ^~~~~~~~
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.cpp:958:14: note: call 'std::move' explicitly to avoid copying
      return GPUArchs;
             ^~~~~~~~
             std::move(GPUArchs)

Plus another few similar cases (on lines 953, 958 and 967).

hvdijk added a commit that referenced this pull request Jul 23, 2025
@hvdijk
Copy link
Contributor

hvdijk commented Jul 23, 2025

This broke compilation with Xcode Clang 12 (roughly corresponding to upstream Clang 10):

It's not limited to that, I was seeing it too, it's breaking on 32-bit targets with older compilers that do not implicitly move between non-identical types. I've pushed the obvious fix.

@jhuber6
Copy link
Contributor Author

jhuber6 commented Jul 23, 2025

This broke compilation with Xcode Clang 12 (roughly corresponding to upstream Clang 10):

It's not limited to that, I was seeing it too, it's breaking on 32-bit targets with older compilers that do not implicitly move between non-identical types. I've pushed the obvious fix.

Thanks for fixing that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:AMDGPU clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.